// 'use strict'; //使用严格模式

function sayHello(){
    console.log(this) //非严格模式会指向global对象(全局对象),严格模式会输出undefined
}

sayHello() //默认绑定


const obj={
    name:'zyj',
    age:18,
    greet:function (){
        console.log('hello',this.name)
    }
}

obj.greet() //obj调用greet函数,this指向调用该函数的对象

let greetCopy = obj.greet //隐式丢失,将方法赋值给一个新的变量之后在进行调用
greetCopy() //此时this会丢失,重新退回到默认规则,严格模式下会无法读取this的这个属性,会报错


//显示绑定
const obj2= {
    name:'zmq',
    age:'18'
}

obj.greet.call(obj2) //使用call显示绑定立即调用该函数
greetCopy.call(obj2)

//apply同理,传参方式不同

const bindGreet = obj.greet.bind(obj2) //返回一个新函数,不立即调用该函数
bindGreet()

